package com.example.OnlineStorage.Dao;

import com.example.OnlineStorage.pojo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

/**
 * 用户数据访问接口，定义了对用户数据的增删改查操作。
 */
@Mapper
@Repository
public interface UserDao {
    
    /**
     * 插入用户信息到数据库。
     *
     * @param user 用户对象，包含待插入的用户信息。
     * @return 返回插入操作的影响行数。
     */
    Integer insert(User user);
    
    /**
     * 根据用户ID删除用户信息。
     *
     * @param id 待删除用户的ID。
     * @return 返回删除操作的影响行数。
     */
    Integer delete(Long id);
    
    /**
     * 更新用户信息。
     *
     * @param user 包含待更新用户信息的用户对象。
     * @return 返回更新操作的影响行数。
     */
    Integer update(User user);
    
    /**
     * 更新用户的密码。
     *
     * @param user 包含待更新密码信息的用户对象。
     * @return 返回更新操作的影响行数。
     */
    Integer updatePassword(User user);
    
    /**
     * 根据用户ID查询用户信息。
     *
     * @param id 待查询用户的ID。
     * @return 返回匹配的用户对象，如果不存在则返回null。
     */
    User select(Long id);

    /**
     * 查询重复的 username
     * @param username 要查询的username
     * @return 重复的数量
     */
    Long repeatUsername(String username);

    /**
     * 查询重复的 email
     * @param email 要查询的email
     * @return 重复的数量
     */
    Long repeatEmail(String email);

    /**
     * 根据用户名查询用户信息。
     *
     * @param user 包含待查询用户名的用户对象。
     * @return 返回匹配的用户对象，如果不存在则返回null。
     */
    User loginByUsername(User user);
    
    /**
     * 根据邮箱查询用户信息。
     *
     * @param user 包含待查询邮箱的用户对象。
     * @return 返回匹配的用户对象，如果不存在则返回null。
     */
    User loginByEmail(User user);
    
    /**
     * 查询具有特定头像URL的用户数量。
     *
     * @param avatarUrl 特定的头像URL。
     * @return 返回具有特定头像URL的用户数量。
     */
    Integer selectAvatarCount(String avatarUrl);
}

